package com.cskaoyan.javase.array._4operation._4copy;

import java.util.Arrays;

/**
 * 数组的拷贝
 *
 * 数组的长度是不可以改变的，所以如果想要实现数组元素"真正意义上的"删除和新增，一般需要使用数组的拷贝。
 * 大致思路是:
 *      (这里不可能直接在原先的老数组中,完成,需要创建新数组)
 *      创建一个新数组,然后拷贝赋值
 *      这个过程中,首先需要创建出新数组,首先需要明确新数组的长度，初始化这个新数组。
 *      然后遍历原先的数组，过滤掉（或者新增）一些元素，给新数组赋值。
 *
 *
 * @since 09:28
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] old = {1, 2, 3};
        int[] newArr = realAddElementToIntArr(old, -10);
        System.out.println(Arrays.toString(newArr));
        System.out.println("-------------------");
        int[] arr = {1, 2, 2, 1, 2, 3};
        int[] result = realDelElementsInIntArr(arr, 2);
        System.out.println(Arrays.toString(result));
    }

    // 需求1: 给出一个int类型数组,直接新增一个元素
    /*
        分析:
            不可能直接在原先的数组中完成,需要创建一个新数组
                这个新数组如何创建?
                新数组创建完毕后,如何给新数组赋值?
     */

    /**
     * 通过创建新数组,进行数组元素拷贝,完成数组元素的新增
     * @param old 被新增元素的老数组
     * @param target 被新增的元素
     * @return int[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/06/10 9:33
     */
    public static int[] realAddElementToIntArr(int[] old, int target) {
        // 这个新数组如何创建?
        // 这里肯定是动态初始化,新数组的长度 = 老数组的长度 + 1
        int newLength = old.length + 1;
        int[] result = new int[newLength];
        // 新数组创建完毕后,如何给新数组赋值?
        /*
            新数组的元素是,老数组的元素 + 新增的元素
            所以需要将老数组中的所有元素,全部复制到新数组
            这个过程需要遍历老数组,然后给新数组赋值
         */
        // 创建一个int变量,表示新数组的下标
        int newIndex = 0;
        for (int ele : old) {
            result[newIndex] = ele;
            newIndex++;
        }
        /*
            以上遍历完成,老数组中的元素,全部复制到新数组中了
            现在新数组还有最后一个位置是空着的
            所以就把新增的元素赋值进去
          */
        result[newLength - 1] = target;
        return result;
    }

    // 需求2: 给出一个int类型数组,要求删除某个元素(该元素可能不唯一)
    /*
        这里也需要创建一个新数组
        1.新数组的长度 = 老数组的长度 - 被删除元素的个数
        接下来开始给新数组赋值
        2.仍然是把老数组的元素赋值给新数组,但是要过滤掉被删除的元素(删除元素其实是过滤元素)
     */
    public static int[] realDelElementsInIntArr(int[] old, int target) {
        // 1.求出被删除元素的个数,计数需要计数器,也就是需要一个int count来计数
        int delElementCount = 0;
        for (int ele : old) {
            if (ele == target) {
                delElementCount++;
            }
        }
        // 代码运行到这里,count就是被删除元素的个数
        // 2.创建新数组
        int newLength = old.length - delElementCount;
        int[] result = new int[newLength];
        // 3.给新数组赋值
        // 仍然需要一个变量指代新数组的下标
        int newIndex = 0;
        for (int ele : old) {
            if (ele == target) {
                // 被删除的元素跳过,不往新数组里赋值
                continue;
            }
            result[newIndex] = ele;
            newIndex++;
        }
        // 赋值完毕,返回新数组
        return result;
    }
}
